# -*- coding: UTF-8 -*- #
"""
@filename:01-3图像的基本操作.py
@author:JiYujia
@time:2022-09-04
"""
import cv2
import numpy as np

img = cv2.imread('pics/1.jpg')

# 1创建全黑图像 rgb=0
img1 = np.zeros((300, 300, 1), np.uint8)
#                行    列  通道数
# 灰度图的通道数为1，彩色图的通道为3
# 描述一个像素点，如果是灰度，那么只需要一个数值来描述它，就是单通道。
# 如果一个像素点，有RGB三种颜色来描述它，就是三通道
# 4通道通常为RGBA，在某些处理中可能会用到。
# 2通道图像不常见，通常在程序处理中会用到，如傅里叶变换，可能会用到，一个通道为实数，一个通道为虚数，主要是编程方便。

# print('img1:', img1)

# 2创建全白图像 rgb=255
img2 = np.ones((500, 500, 3), np.uint8) * 255

# 3创建空白数组
img3 = np.empty((400, 300, 3), np.uint8)

# cv2.imshow('zeros', img1)
# cv2.imshow('ones', img2)
# cv2.imshow('empty', img3)

# 创建相同形状的多维数组
imgdog = cv2.imread('pics/dog.png')
imgblacklike = np.zeros_like(imgdog)
imgwhitelike = np.ones_like(imgdog) * 255

cv2.imshow('imgblacklike', imgblacklike)
cv2.imshow('imgwhitelike', imgwhitelike)

# 切片方式
# img[100:300, 100:400] = [0, 0, 0]
# cv2.imshow('src image', img)
# cv2.imwrite('pics/01-3_save.jpg', img);

cv2.waitKey(0)

"""
1、NumPy 是python语言中一种开源的数值计算拓展工具。
（1）可以用来存储和处理大型矩阵
（2）支持大量的维度数组与矩阵运算
（3）对数组运算提供大量的数学函数库
（4）提供许多高级的数值编程工具

2、其N维数组对象ndarray，是一系列同类型数据的集合，用于存放同类型元素的多维数组
OpenCV 中图像对象的数据结构是 ndarray 多维数组，因此可以用 Numpy 创建多维数组来生成图像。特别对于空白、黑色、白色、随机等特殊图像，用 Numpy 创建图像非常方便。

3、图像在计算机中用矩阵的形式表示，可以通过矩阵来创建矩阵图像
array：将list类型列表转化成ndarray类型的数组
empty：创建一个指定形状、数据类型且未初始化（随机值）的数组
zeros：创建指定大小的数组，数组元素以0来填充
ones：创建指定形状的数组，数组元素以1来填充

numpy.empty(shape[, dtype, order]) # 返回一个指定形状和类型的空数组
numpy.zeros(shape[, dtype, order]) # 返回一个指定形状和类型的全零数组
numpy.ones(shape[, dtype, order]) # 返回一个指定形状和类型的全一数组

numpy.empty_like(img) # 返回一个与图像 img 形状和类型相同的空数组
numpy.zeros_like(img) # 返回一个与图像 img 形状和类型相同的全零数组
numpy.ones_like(img) # 返回一个与图像 img 形状和类型相同的全一数组

shape：整型元组，定义返回多维数组的形状
dtype：数据类型，定义返回多维数组的类型，可选项
img：ndarray 多维数组，表示一个灰度或彩色图像

# 解释通道数的参考：https://blog.csdn.net/mvtechnology/article/details/9008499
"""